package atack.tesis.kelluntekun.ui.componentes;

import atack.tesis.kelluntekun.enums.OpcSnippets;

import com.vaadin.terminal.Sizeable;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.BaseTheme;
import com.vaadin.ui.themes.Reindeer;

/**
 * @author marza
 *
 */
public class codesTable extends VerticalLayout{
	
	private static final long serialVersionUID = 1L;
	
	private TabSheet t;
	private VerticalLayout vlySnippetsTable;
	private HorizontalLayout hlyMenuSnippets;
	private HorizontalSplitPanel hrSplit;
	
	private Table tCodes;
	private Button btAddSnippet;
	private Button btDelSnippet;
	
	/**
	 * Construye el componente donde se presentarán tanto los snippets,en una tabla, como la información de cada snippets
	 */
	public codesTable(){
		setMargin(false);
		setSpacing(false);
		setWidth("100%");
		setHeight("100%");
		
		t = new TabSheet();
		t.setStyleName(Reindeer.TABSHEET_SMALL);
		t.setSizeFull();
		
		hrSplit = new HorizontalSplitPanel();
		hrSplit.setHeight("100%");
		hrSplit.setWidth("100%");
		hrSplit.setSplitPosition(30,Sizeable.UNITS_PERCENTAGE);
		hrSplit.setStyleName(Reindeer.SPLITPANEL_SMALL);
		
		vlySnippetsTable = new VerticalLayout();
		vlySnippetsTable.setMargin(false);
		vlySnippetsTable.setSpacing(false);
		
		buildMenuSnippets();
		vlySnippetsTable.addComponent(hlyMenuSnippets);
		
		tCodes= new Table();
		tCodes.setVisible(false);
		vlySnippetsTable.addComponent(tCodes);
		
		
		hrSplit.addComponent(vlySnippetsTable);
		
		t.addTab(hrSplit, "Códigos");
		addComponent(t);
	}

	/**
	 * Construye el menu que contiene los botones para eliminar y crear snippets.
	 */
	private void buildMenuSnippets(){
		hlyMenuSnippets = new HorizontalLayout();
		hlyMenuSnippets.setStyleName(Reindeer.LAYOUT_BLACK);
		hlyMenuSnippets.setMargin(false);
		hlyMenuSnippets.setSpacing(true);
		hlyMenuSnippets.setWidth("100%");
		hlyMenuSnippets.setHeight(null);
		
		btDelSnippet= new Button();
		btDelSnippet.setWidth(null);
		btDelSnippet.setStyleName(BaseTheme.BUTTON_LINK);
		btDelSnippet.setDescription(OpcSnippets.ELIMINAR.toString());
		btDelSnippet.setIcon(new ThemeResource("../runo/icons/32/document-delete.png"));
		hlyMenuSnippets.addComponent(btDelSnippet);
		hlyMenuSnippets.setComponentAlignment(btDelSnippet, Alignment.MIDDLE_LEFT);
		
		btAddSnippet = new Button();
		btAddSnippet.setStyleName(BaseTheme.BUTTON_LINK);
		btAddSnippet.setWidth(null);
		btAddSnippet.setDescription(OpcSnippets.AGREGAR.toString());
		btAddSnippet.setIcon(new ThemeResource("../runo/icons/32/document-add.png"));
		hlyMenuSnippets.addComponent(btAddSnippet);
		hlyMenuSnippets.setComponentAlignment(btAddSnippet, Alignment.MIDDLE_RIGHT);
	}
	
	/**
	 * Construye con "desfase" la tabla en la que se muestran los codigos
	 * 
	 */
	public void buildTableCodes(){
		vlySnippetsTable.removeComponent(tCodes);
		
		tCodes= new Table();
		tCodes.setWidth("100%");
		tCodes.setSelectable(true);
		tCodes.setMultiSelect(false);
		tCodes.setNullSelectionAllowed(true);
		tCodes.setImmediate(true);
		tCodes.setPageLength(0);
		tCodes.setStyleName(Reindeer.TABLE_STRONG);
		vlySnippetsTable.addComponent(tCodes);
	}
	
	public void setCaptionTableCodes(String caption){
		this.tCodes.setCaption(caption);
	}
	/**
	 * Retorna la Tabla en la que son cargados y mostrados los Snippets de la carpeta seleccionada.
	 * @return tCodes (Tabla de codigos)
	 */
	public Table gettCodes() {
		return tCodes;
	}
	public void settCodes(Table tCodes) {
		this.tCodes = tCodes;
	}
	
	/**
	 * Setea el componente que va a la derecha del horizontal split (hrSplit) 
	 * a la izquierda queda la tabla que muestra los snippets de una carpeta,
	 * a la derecha la información y codigo del snippet seleccionado.
	 *   
	 * @param c recibe un componente cualquiera, para el caso será el componente 'codeInfoWiew'
	 */
	public void setRightComponent(Component c){
		//Recibe codeInfoWiew
		this.hrSplit.setSecondComponent(c);
	}
	
	/**
	 * Remueve el componente a la derecha del hrSplit.
	 * para el caso será 'codeInfoWiew'
	 */
	public void removeRightComponent(){
		if(this.hrSplit.getSecondComponent()!=null){
			this.hrSplit.removeComponent(this.hrSplit.getSecondComponent());
		}
	}
	
	/**
	 * retorna el botón destinado a agregar nuevos Snippets
	 * @return btAddSnippet
	 */
	public Button getBtAddSnippet() {
		return btAddSnippet;
	}
	public void setBtAddSnippet(Button btAddSnippet) {
		this.btAddSnippet = btAddSnippet;
	}
	
	/**
	 * retorna el botón destinado a borrar Snippets.
	 * @return btDelSnippet
	 */
	public Button getBtDelSnippet() {
		return btDelSnippet;
	}
	public void setBtDelSnippet(Button btDelSnippet) {
		this.btDelSnippet = btDelSnippet;
	}
}